package br.org.acessobrasil.portal.persistencia;

import java.util.List;

import javax.persistence.NoResultException;

import org.springframework.transaction.annotation.Transactional;

import br.org.acessobrasil.portal.modelo.Menu;
import br.org.acessobrasil.portal.modelo.PadraoApresentacao;
import br.org.acessobrasil.portal.modelo.Pagina;
import br.org.acessobrasil.portal.modelo.Perfil;
import br.org.acessobrasil.portal.modelo.Setor;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.TipoConteudo;
public class SitioDaoSpring extends SuperDao<Sitio> {
	private static SitioDaoSpring instance;
	public SitioDaoSpring(){
		super();
		instance = this;
	}
	
	/**
	 * 
	 * @return lista de sitios
	 */
	@SuppressWarnings("unchecked")
	@Transactional(readOnly=true)
	public List<Sitio> list(){
		return getEntityManager().createQuery("Select s From Sitio s order by s.no_sitio").getResultList();
	}

	@SuppressWarnings("unchecked")
	public Sitio select(String url){
		List l =getEntityManager().createQuery("Select s From Sitio s where s.url = ?").setParameter(1,url).getResultList(); 
		if(l.size()>0)
			return (Sitio)l.get(0);
		else 
			return null;
	}
	
	/**
	 * Seleciona pelo nu_sitio<br>
	 * caso nao tenha<br>
	 * seleciona por no_sitio && de_sitio
	 * @param sitio
	 * @return sitio ou null
	 */
	public Sitio select(Sitio sitio) {
		if(sitio.getNuSitio()!=null){
			return select(sitio.getNuSitio());
		}
		if(sitio.getNoSitio()!=null && sitio.getDeSitio()!=null){
			try{
				return (Sitio)getEntityManager().createQuery("Select s From Sitio s where s.no_sitio=:noSitio and s.de_sitio=:deSitio")
					.setParameter("noSitio",sitio.getNoSitio())
					.setParameter("deSitio",sitio.getDeSitio())
					.getSingleResult();
			}catch(NoResultException e){
				return null;
			}
		}
		return null;
	}
	
	public void delete(long id) throws Exception {
		Sitio sitio = select(id);
		super.delete(sitio);
	}

	public static SitioDaoSpring getInstance() {
		return instance;
	}

	@Override
	public Sitio select(Long id) {
		return getEntityManager().find(Sitio.class, id);
	}
	
	private void apagarPerfil(Sitio sitio) throws Exception{
		PerfilDaoSpring perfilDaoSpring = new PerfilDaoSpring();
		perfilDaoSpring.setEntityManager(getEntityManager());
		List<Perfil> listPerfil = perfilDaoSpring.list(sitio);
		for(Perfil perfil:listPerfil){
			perfilDaoSpring.delete(perfil);
		}
	}
	
	private void apagarSetores(Sitio sitio) throws Exception {
		SetorDao setorDaoSpring = new SetorDao();
		setorDaoSpring.setEntityManager(getEntityManager());
		List<Setor> listSetor = setorDaoSpring.list(sitio);
		for(Setor setor:listSetor){
			setorDaoSpring.delete(setor);
		}
	}
	
	private void apagarMenus(Sitio sitio) throws Exception{
		MenuDaoSpring menuDaoSpring = new MenuDaoSpring();
		menuDaoSpring.setEntityManager(getEntityManager());
		List<Menu> listMenu = menuDaoSpring.list(sitio);
		for(Menu menu:listMenu){
			menuDaoSpring.delete(menu);
		}
	}
	
	private void apagarTemplates(Sitio sitio) throws Exception{
		PadraoApresentacaoDaoSpring padraoApresentacaoDaoSpring = new PadraoApresentacaoDaoSpring();
		padraoApresentacaoDaoSpring.setEntityManager(getEntityManager());
		List<PadraoApresentacao> listPadraoApresentacao = padraoApresentacaoDaoSpring.listaTodos(sitio);
		for(PadraoApresentacao padraoApresentacao:listPadraoApresentacao){
			padraoApresentacaoDaoSpring.delete(padraoApresentacao);
		}
	}
	
	private void apagarTipoConteudo(Sitio sitio) throws Exception {
		TipoConteudoDaoSpring tipoConteudoDaoSpring = new TipoConteudoDaoSpring();
		tipoConteudoDaoSpring.setEntityManager(getEntityManager());
		List<TipoConteudo> listTipoConteudo = tipoConteudoDaoSpring.list(sitio);
		for(TipoConteudo tipoConteudo:listTipoConteudo){
			tipoConteudoDaoSpring.delete(tipoConteudo);
		}
	}
	
	private void apagarRelacaoComUsuario(Sitio sitio){
		getEntityManager().createNativeQuery("DELETE FROM sgctb_usuario_sgctb_sitio WHERE listSitio_nu_sitio=:idSitio")
			.setParameter("idSitio",sitio.getNuSitio())
			.executeUpdate();
	}
	
	private void apagarPaginas(Sitio sitio){
		PaginaDaoSpring paginaDao = new PaginaDaoSpring();
		paginaDao.setEntityManager(getEntityManager());
		List<Pagina> listPagina = paginaDao.list(sitio.getNuSitio());
		for (Pagina pagina : listPagina) {
			paginaDao.delete(pagina);
		}
	}
	
	@Override
	public void delete(Long id) throws Exception {
		delete(select(id));
	}
	
	@Override
	public void delete(Sitio sitio) throws Exception {
		try{
			sitio.setNuMenuPrincipal(null);
			sitio.setMenuPrincipal(null);
			getEntityManager().createNativeQuery("Update sgctb_sitio set nu_menu_principal = NULL WHERE nu_sitio=:idSitio")
				.setParameter("idSitio",sitio.getNuSitio())
				.executeUpdate();
		}catch(Exception e){
			e.printStackTrace();
		}
		apagarPerfil(sitio);
		apagarMenus(sitio);
		apagarSetores(sitio);
		apagarTemplates(sitio);
		apagarTipoConteudo(sitio);
		apagarRelacaoComUsuario(sitio);
		apagarPaginas(sitio);
		super.delete(sitio);
	}
	
	public Sitio buscarPorPastaArquivos(String nomeDaPasta){
		try{
			return (Sitio)getEntityManager().createQuery("Select s From Sitio s where s.no_pasta_arquivos =:noPastaArquivos")
				.setParameter("noPastaArquivos",nomeDaPasta).getSingleResult();
		}catch(NoResultException e){
			return null;
		}
	}

}
